#include <avr/io.h> #include <util/delay.h> #define output(directions,pin) (directions |= pin) // set port direction for output #define input(directions,pin) (directions &= (~pin)) // set port direction for input #define set(port,pin) (port |= pin) // set port pin #define clear(port,pin) (port &= (~pin)) // clear port pin #define pin_test(pins,pin) (pins & pin) // test for port pin #define bit_test(byte,bit) (byte & (1 << bit)) // test for bit set #define bit_delay_time 102 // bit delay for 9600 with overhead #define bit_delay() _delay_us(bit_delay_time) // RS232 bit delay #define half_bit_delay() _delay_us(bit_delay_time/2) // RS232 half bit delay #define input_port PORTA #define input_direction DDRA #define input_pin (1 << PA3) #define input_pins PINA #define serial_port PORTA #define serial_direction DDRA #define serial_pin_out (1 << PA1)
void put_char(volatile unsigned char *port, unsigned char pin, char txchar) {
//
// send character in txchar on port pin
// assumes line driver (inverts bits)
//
// start bit
//
clear(*port,pin);
bit_delay();
//
// unrolled loop to write data bits
//
if bit_test(txchar,0)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,1)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,2)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,3)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,4)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,5)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,6)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,7)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
//
// stop bit
//
set(*port,pin);
bit_delay();
//
// char delay
//
bit_delay();
}CLKPR = (1 << CLKPCE); CLKPR = (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0);
set(serial_port, serial_pin_out); output(serial_direction, serial_pin_out); set(input_port, input_pin); // turn on pull-up input(input_direction, input_pin);
DDRA |= 0b10000000; double V; int A[94]; int pos; unsigned int flag; unsigned int i = 0; int S;
if (V < 2){
for ( i = 0; i < 95 ; i++ ){
A[i] = 0;}
for(i = 0;i<1520;i++){
V = PINA & 1<<PA2;
if (V < 2){
PORTA |= 0b10000000;
index = i/16;
pos = i%16;
flag = 1;
flag = flag << pos;
A[index] = A[index] | flag;
_delay_us(50);
}
else{
PORTA &= ~(0b10000000);
index = i/16;
pos = i%16;
flag = 1;
flag = flag << pos;
flag = ~flag;
A[index] = A[index] & flag;
_delay_us(50);
}
}
if (A[43]==0 & A[48]!=0){
put_char(&serial_port, serial_pin_out, '2');_delay_ms(1000);
}
if (A[43]==-256){
put_char(&serial_port, serial_pin_out, '1');_delay_ms(1000);
}
if (A[43]==0 & A[48]==0 & A[0]==-1){
put_char(&serial_port, serial_pin_out, '3');_delay_ms(1000);
}
_delay_ms(2000);
}
PORTA &= ~(0b10000000);#!/usr/bin/env python
#
# term.py
#
# term.py serial_port port_speed
#
# Neil Gershenfeld
# CBA MIT 7/27/07
#
# (c) Massachusetts Institute of Technology 2007
# This work may be reproduced, modified, distributed,
# performed, and displayed for any purpose. Copyright is
# retained and must be preserved. The work is provided
# as is; no warranty is provided, and users accept all
# liability.
#
import sys,time,serial
from Tkinter import *
from select import *
NROWS = 40
NCOLS = 16
def key(event):
#
# key press event handles
#
key = event.char
#print 'send',ord(key)
if (ord(key) == 13):
key = chr(10)
ser.write(key)
def quit():
#
# clean up and quit
#
sys.exit()
def idle(parent):
#
# idle loop
#
wait = ser.inWaiting()
if (wait != 0):
#
# read character
#
byte = ser.read()
widget_text.config(state=NORMAL)
#print byte,ord(byte)
if (ord(byte) == 10):
#
# CR
#
widget_text.insert(INSERT,'\n')
if (int(float(widget_text.index(END))) > (NROWS+1)):
widget_text.delete(1.0,2.0)
#if (ord(byte) == 13):
#
# CR
#
#widget_text.insert(INSERT,'\n')
#if (int(float(widget_text.index(END))) > (NROWS+1)):
# widget_text.delete(1.0,2.0)
elif (byte == 8):
#
# BS
#
widget_text.delete(INSERT+"-1c",INSERT)
else:
#
# character
#
widget_text.insert(INSERT,byte)
widget_text.config(state=DISABLED)
time.sleep(0.001)
parent.after_idle(idle,parent)
#
# check command line arguments
#
if (len(sys.argv) != 3):
print "command line: term.py serial_port speed"
sys.exit()
port = sys.argv[1]
speed = int(sys.argv[2])
#
# open serial port
#
ser = serial.Serial(port,speed)
ser.parity=serial.PARITY_NONE
ser.setDTR()
#
# flush buffers
#
ser.flushInput()
ser.flushOutput()
#
# set up UI
#
root = Tk()
root.bind('',key)
root.title('term.py')
#
widget_quit = Button(root, text="quit",command=quit)
widget_quit.pack()
#
address_frame = Frame(root)
Label(address_frame,text="port: "+port).pack(side='left')
Label(address_frame,text=" speed: "+str(speed)).pack(side='left')
address_frame.pack()
#
widget_text = Text(root, bg='white', bd=5, width=NCOLS, height=NROWS, font=('arial',10,'bold'))
#widget_text.bind('',key)
widget_text.config(state=DISABLED)
widget_text.pack()
#
# begin event loop
#
root.after(100,idle,root)
root.mainloop()
Term.py was used to check what specifies which button was pressed from the remote control. The images below show a part of the code sent from the remote when buttons 1 and 2 are pressed.It can be noticed that the changes start to appear after the 11th line.

#include <avr/io.h>
#include <util/delay.h>
#define output(directions,pin) (directions |= pin) // set port direction for output
#define input(directions,pin) (directions &= (~pin)) // set port direction for input
#define set(port,pin) (port |= pin) // set port pin
#define clear(port,pin) (port &= (~pin)) // clear port pin
#define pin_test(pins,pin) (pins & pin) // test for port pin
#define bit_test(byte,bit) (byte & (1 << bit)) // test for bit set
#define bit_delay_time 102 // bit delay for 9600 with overhead
#define bit_delay() _delay_us(bit_delay_time) // RS232 bit delay
#define half_bit_delay() _delay_us(bit_delay_time/2) // RS232 half bit delay
#define input_port PORTA
#define input_direction DDRA
#define input_pin (1 << PA3)
#define input_pins PINA
#define serial_port PORTA
#define serial_direction DDRA
#define serial_pin_out (1 << PA1)
void put_char(volatile unsigned char *port, unsigned char pin, char txchar) {
//
// send character in txchar on port pin
// assumes line driver (inverts bits)
//
// start bit
//
clear(*port,pin);
bit_delay();
//
// unrolled loop to write data bits
//
if bit_test(txchar,0)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,1)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,2)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,3)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,4)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,5)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,6)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
if bit_test(txchar,7)
set(*port,pin);
else
clear(*port,pin);
bit_delay();
//
// stop bit
//
set(*port,pin);
bit_delay();
//
// char delay
//
bit_delay();
}
int main(void) {
//
// main
//
// set clock divider to /1
//
CLKPR = (1 << CLKPCE);
CLKPR = (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0);
//
// initialize pins
//
set(serial_port, serial_pin_out);
output(serial_direction, serial_pin_out);
set(input_port, input_pin); // turn on pull-up
input(input_direction, input_pin);
//
// main loop
//
DDRA |= 0b10000000;
double V;
int A[94];
int pos;
unsigned int flag;
unsigned int i = 0;
int S;
while (1) {
V = PINA & 1<<PA2;
int index = 0;
for ( i = 0; i < 95 ; i++ ){
A[i] = 0;}
if (V < 1){
for(i = 0;i<1520;i++){
V = PINA & 1<<PA2;
if (V < 1){
PORTA |= 0b10000000;
index = i/16;
pos = i%16;
flag = 1;
flag = flag << pos;
A[index] = A[index] | flag;
_delay_us(50);
}
else{
PORTA &= ~(0b10000000);
index = i/16;
pos = i%16;
flag = 1;
flag = flag << pos;
flag = ~flag;
A[index] = A[index] & flag;
_delay_us(50);
}
}
if (A[43]==0 & A[48]!=0){
put_char(&serial_port, serial_pin_out, '2');_delay_ms(1000);
}
if (A[43]==-256){
put_char(&serial_port, serial_pin_out, '1');_delay_ms(1000);
}
if (A[43]==0 & A[48]==0 & A[0]==-1){
put_char(&serial_port, serial_pin_out, '3');_delay_ms(1000);
}
_delay_ms(2000);
}
PORTA &= ~(0b10000000);
/*S = PINA & 1<<PA3;
if (S < 1){
for(i = 0;i<1520;i++){
index = i/16;
pos = i%16;
flag = 1;
flag = flag << pos;
flag = ~flag;
if ( ~(A[index] | flag) == 0 ){
PORTA |= 0b10000000;
_delay_us(500);
put_char(&serial_port, serial_pin_out, '1');
}
else{
PORTA &= ~(0b10000000);
_delay_us(500);
put_char(&serial_port, serial_pin_out, '0');
}
}
}
PORTA &= ~(0b10000000);*/
/*S = PINA & 1<<PA3;
if (S < 1){
if (A[43]==0 & A[48]!=0){
put_char(&serial_port, serial_pin_out, '2');_delay_ms(1000);
}
if (A[43]==-256){
put_char(&serial_port, serial_pin_out, '1');_delay_ms(1000);
}
if (A[43]==0 & A[48]==0){
put_char(&serial_port, serial_pin_out, '3');_delay_ms(1000);
}
}*/
//PORTA |= 0b10000000;put_char(&serial_port, serial_pin_out, 'd');_delay_ms(1058);
//PORTA &= ~(0b10000000);put_char(&serial_port, serial_pin_out, 'u');_delay_ms(1058);
//
// wait for button down
//
/*while (0 != pin_test(input_pins,input_pin))
;
put_char(&serial_port, serial_pin_out, 'd');
//
// wait for button up
//
while (0 == pin_test(input_pins,input_pin))
;
put_char(&serial_port, serial_pin_out, 'u');*/
}
}

